#include "../include/deng.h"

// root界面
void root()
{
    char hu[] = "正在登录......";
    deng_jindutiao(0, 0, 2, hu);
    printf("欢迎超级用户！\n");
    printf("请选择你的选项：\n");
    while (1)
    {
        printf("1、设定航班\t2、删除用户\t3、修改用户信息\t4、修改航班\t5、刷新\t6、增加超级用户\t7、退出\n");
        int i = 0;
        while (1)
        {
            scanf("%d", &i);
            if (i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7)
            {
                break;
            }
            else
            {
                printf("输入有误，请重新输入：\n");
                while (getchar() != '\n')
                    ;
                continue;
            }
        }
        system("clear");
        switch (i)
        {
        case 1:
            root_sheding();
            break;
        case 2:
            root_shan();
            break;
        case 3:
            root_xiugai();
            break;
        case 4:
            root_xiugai_hang();
            break;
        case 5:
            root_shauxin();
            break;
        case 6:
            root_zeng();
            break;
        case 7:
            printf("欢迎使用！\n");
            return;
        default:
            return;
        }
    }
    return;
}

// 设定航班
void root_sheding()
{
    Link_hang *H = nacun_hang(); // 把文件里面的东西拿出来(航班)
    hang *test_hang = (hang *)malloc(sizeof(hang));
    test_hang->next = NULL;
    test_hang->prev = NULL;
    while (1)
    {
        printf("请输入 航班号：");
        scanf("%s", test_hang->data.number);
        printf("请输入 起点站：");
        scanf("%s", test_hang->data.staddress);
        printf("请输入 终点站：");
        scanf("%s", test_hang->data.arraddress);
        printf("请输入 班期：");
        scanf("%s", test_hang->data.DATE);
        printf("请输入 机型：");
        scanf("%s", test_hang->data.TYPE);
        printf("请输入 起飞时间：");
        scanf("%s", test_hang->data.stime);
        printf("请输入 到达时间：");
        scanf("%s", test_hang->data.atime);
        printf("请输入 票价：");
        scanf("%d", &(test_hang->data.value));
        printf("请输入 额定载客量：");
        scanf("%d", &(test_hang->data.maxNUM));
        printf("请输入 剩余座位数量：");
        scanf("%d", &(test_hang->data.leftbuyersa));
        printf("请输入 是否起飞：(y) (n)");
        while (getchar() != '\n')
            ; // 防止终端上的元素干扰
        scanf("%c", &(test_hang->data.whetherfly));
        print_link_hang_1(test_hang);
        int te = 0;
        printf("是否确认？\t1、确认\t2、重新写\t3、退出\n");
        while (1)
        {
            scanf("%d", &te);
            if (te == 1 || te == 2 || te == 3)
            {
                break;
            }
            else
            {
                printf("输入有误，请重新输入：\n");
                while (getchar() != '\n')
                    ;
                continue;
            }
        }
        if (te == 1)
        {
            weicha_hang(H, test_hang);
            fprint_hang(H);
            printf("欢迎使用！\n");
            break;
        }
        else if (te == 2)
        {
            continue;
        }
        else if (te == 3)
        {
            printf("欢迎使用！\n");

            break;
        }
    }
    free_link_hang(&H);
    pause_and_continue();
    return;
}

// 2、删除用户
void root_shan()
{
    int flag_1 = 0;
    char name_1[40];
    Link_list *L = nacun(); // 把文件里面的东西放在链表里面
    printf("请选择你要删除的人的名字\n");
    while (1)
    {
        scanf("%s", name_1);
        Node *ptr = L->next;
        size_t i;
        for (i = 1; ptr != NULL; i++) // 循环比较
        {
            if (strcmp(ptr->data.name, name_1) == 0)
            {
                flag_1 = -98;
                break;
            }
            ptr = ptr->next; // 往后移
        }
        if (flag_1 == -98)
        {
            renyishan(L, i); // 删除
            printf("删除成功！\n");
            break;
        }
        else
        {
            printf("没有找到该人，请重新输入：\n");
            while (getchar() != '\n')
                ;
            continue;
        }
    }
    fprint_wen(L);
    free_link_list(&L);
    pause_and_continue();
    return;
}

// 3、修改用户信息
void root_xiugai()
{
    Link_list *L = nacun(); // 把文件里面的东西放在链表里面
    printf("以下是所有用户的信息\n");
    print_link_list(L);
    Node *N = root_ming(L);
    if (strcmp(N->data.userType, "root") == 0)
    {
        printf("超级用户不可以修改!\n");
        pause_and_continue();
        return;
    }
    printf("请选择你需要修改的内容：\n");
    int flah_i = 0;
    while (1)
    {
        printf("1、修改用户类型\t2、修改账号\t3、修改密码\t4、修改用户名\t5、修改余额\t6、删除订单\t7、退出\n");
        int i = 0;
        while (1)
        {
            scanf("%d", &i);
            if (i >= 1 && i <= 7)
            {
                break;
            }
            else
            {
                printf("输入有误，请重新输入：\n");
                while (getchar() != '\n')
                    ;
                continue;
            }
        }
        system("clear");
        switch (i)
        {
        case 1:
            root_xiugai_uesr_1(N);
            break;
        case 2:
            root_xiugai_uesr_2(N);
            break;
        case 3:
            root_xiugai_uesr_3(N);
            break;
        case 4:
            root_xiugai_uesr_4(N);
            break;
        case 5:
            root_xiugai_uesr_5(N);
            break;
        case 6:
            root_xiugai_uesr_6(N);
            ;
            break;
        case 7:
            flah_i = 1;
            break;
        default:
            break;
        }
        printf("修改成功！\n");
        printf("修改后的用户信息为：\n");
        print_link_list_1(N);
        if (flah_i)
        {
            break;
        }
    }
    fprint_wen(L);
    fprint_jilu(L);
    free_link_list(&L);
    pause_and_continue();
    return;
}

// 判断用户等级
void root_dengji(int ar, char *dengji)
{
    if (ar == 10)
    {
        strcpy(dengji, "普通");
    }
    else if (ar == 9)
    {
        strcpy(dengji, "白银");
    }
    else if (ar == 8)
    {
        strcpy(dengji, "黄金");
    }
    else if (ar == 7)
    {
        strcpy(dengji, "白金");
    }
    else if (ar == 5)
    {
        strcpy(dengji, "超级");
    }
}

// 根据名字查找到用户并返回用户指针
Node *root_ming(Link_list *L)
{
    int flag_1 = 0;
    char name_1[20]; // 用户名
    printf("请选择你要修改的人的名字\n");
    while (1)
    {
        scanf("%s", name_1);
        Node *ptr = L->next;
        for (size_t i = 0; ptr != NULL; i++) // 循环比较
        {
            if (strcmp(ptr->data.name, name_1) == 0) // 如果有这个人
            {
                flag_1 = -98;
                break;
            }
            ptr = ptr->next; // 往后移
        }
        if (flag_1 == -98)
        {
            printf("查询到以下信息：\n");
            print_link_list_1(ptr);
            return ptr;
        }
        else
        {
            printf("没有找到该人，请重新输入：\n");
            while (getchar() != '\n')
                ;
            continue;
        }
    }
}

// 修改用户用户类型
void root_xiugai_uesr_1(Node *N)
{
    char userType[10]; // 用户类型
    printf("请输入修改后的用户类型：\n");
    scanf("%s", userType);
    strcpy(N->data.userType, userType);
    return;
}

// 修改用户账号
void root_xiugai_uesr_2(Node *N)
{
    char id[40]; // 账号
    printf("请输入修改后的用户账号：\n");
    scanf("%s", id);
    strcpy(N->data.id, id);
    return;
}

// 修改用户密码
void root_xiugai_uesr_3(Node *N)
{
    char pos[20]; // 密码
    printf("请输入修改后的用户密码：\n");
    scanf("%s", pos);
    strcpy(N->data.pos, pos);
    return;
}

// 修改用户用户名
void root_xiugai_uesr_4(Node *N)
{
    char name[40]; // 用户名
    printf("请输入修改后的用户名：\n");
    scanf("%s", name);
    strcpy(N->data.name, name);
    return;
}

// 修改用户余额
void root_xiugai_uesr_5(Node *N)
{
    int value; // 余额
    printf("请输入修改后的用户余额：\n");
    scanf("%d", &value);
    N->data.value = value;
    user_dengji(N);
    return;
}

// 删除用户订单
void root_xiugai_uesr_6(Node *L)
{
    user_kan(L);
    int flag_1 = 0;
    char temp[20];
    printf("请输入需要删除的航班号：\n");
    int ii = 0;
    while (1)
    {
        scanf("%s", temp);
        for (ii = 0; ii < L->data.a.len; ii++)
        {
            if (strcmp(L->data.a.data[ii].name, temp) == 0) // 如果有这个航班号
            {
                flag_1 = -98;
                break;
            }
        }
        if (-98 == flag_1)
        {
            printf("名单中有该航班号，可以删除！\n");
            break;
        }
        else
        {
            printf("没有购买该航班号，请重新输入：\n");
            while (getchar() != '\n')
                ;
            continue;
        }
    }
    printf("是否删除？\n");
    printf("1、是\t2、否\n");
    while (getchar() != '\n')
        ;
    int j = 0;
    while (1)
    {
        scanf("%d", &j);
        if (j == 1 || j == 2)
        {
            break;
        }
        else
        {
            printf("输入有误，请重新输入：\n");
            while (getchar() != '\n')
                ;
            continue;
        }
    }
    if (j == 1)
    {
        Link_hang *ptr2 = nacun_hang(); // 把文件里面的东西拿出来(航班)
        hang *ptr_2 = ptr2->next;
        while (ptr_2 != NULL)
        {
            if (strcmp(ptr_2->data.number, temp) == 0) // 匹配航班号
            {
                ptr_2->data.leftbuyersa--; // 修改余票
                break;
            }
            ptr_2 = ptr_2->next;
        }
        L->data.value += ptr_2->data.value * (L->data.vip) / 10; // 修改余额
        if (ii == (L->data.a.len - 1))                           // 修改订单记录
        {
            L->data.a.len++; // 票数增加
        }
        else
        {
            for (int i = ii; i < L->data.a.len - 1; i++)
            {
                L->data.a.data[i] = L->data.a.data[i + 1];
            }
            L->data.a.len--;
        }
        fprint_hang(ptr2);
        printf("删除成功！\n");
        pause_and_continue();
        free_link_hang(&ptr2);
        return;
    }
    else
    {
        printf("已取消您的操作！\n");
        pause_and_continue();
        return;
    }
}

// 4、修改航班
void root_xiugai_hang()
{
    Link_hang *ptr = nacun_hang(); // 把文件里面的东西拿出来(航班)
    printf("以下是所有航班的信息\n");
    print_link_hang(ptr);
    hang *H = user_chaxun_hangban(ptr);
    printf("请选择你需要修改的内容：\n");
    int flah_i = 0;
    while (1)
    {
        printf("1、修改起飞点\t2、修改目的点\t3、修改起飞时间\t4、修改目的时间\t5、修改机型\n");
        printf("6、修改班期\t7、修改票价\t8、修改额定载客量\t9、修改剩余座位数量\n10、修改是否起飞\t11、航班号\t12、退出\n");
        int i = 0;
        while (1)
        {
            scanf("%d", &i);
            if (i >= 1 && i <= 12)
            {
                break;
            }
            else
            {
                printf("输入有误，请重新输入：\n");
                while (getchar() != '\n')
                    ;
                continue;
            }
        }
        switch (i)
        {
        case 1:
            root_xiugai_hang_1(H);
            break;
        case 2:
            root_xiugai_hang_2(H);
            break;
        case 3:
            root_xiugai_hang_3(H);
            break;
        case 4:
            root_xiugai_hang_4(H);
            break;
        case 5:
            root_xiugai_hang_5(H);
            break;
        case 6:
            root_xiugai_hang_6(H);
            break;
        case 7:
            root_xiugai_hang_7(H);
            break;
        case 8:
            root_xiugai_hang_8(H);
            break;
        case 9:
            root_xiugai_hang_9(H);
            break;
        case 10:
            root_xiugai_hang_10(H);
            break;
        case 11:
            root_xiugai_hang_11(H);
            break;
        case 12:
            flah_i = 1;
            break;
        default:
            break;
        }
        printf("修改成功！\n");
        printf("修改后的航班信息为：\n");
        print_link_hang_1(H);
        if (flah_i)
        {
            break;
        }
    }
    fprint_hang(ptr);
    free_link_hang(&ptr);
    pause_and_continue();
    return;
}

// 文件的刷新(按照时间)
void root_shauxin()
{
    Link_hang *L = nacun_hang();
    hang *new_1 = (hang *)malloc(sizeof(hang)); // 建立一个新的空间去交换数据
    hang *pt = (hang *)malloc(sizeof(hang));    // 建立一个新的空间去操作链表
    new_1->data = L->next->data;
    int fi = num_hang(L); // 算出链表的长度来进行冒泡排序
    printf("%d\n", fi);
    for (int i = 0; i < fi - 1; i++)
    {
        pt = L->next; // 第一个数据
        for (int j = 0; j < fi - 1 - i; j++)
        {
            if (strcmp(pt->data.DATE, pt->next->data.DATE) > 0)
            {
                new_1->data = pt->data;
                pt->data = pt->next->data;
                pt->next->data = new_1->data;
            }
            pt = pt->next;
        }
    }
    fprint_hang(L);
    printf("刷新成功，下面为刷新后的航班信息\n");
    print_link_hang(L);
    free_link_hang(&L);
    free(new_1);
    free(pt);
    pause_and_continue();
}

// 修改起飞点
void root_xiugai_hang_1(hang *H)
{
    char staddress[10]; // 起点站
    printf("请输入修改后的起飞点：\n");
    scanf("%s", staddress);
    strcpy(H->data.staddress, staddress);
    return;
}

// 修改目的点
void root_xiugai_hang_2(hang *H)
{
    char arraddress[10]; // 终点站
    printf("请输入修改后的目的地：\n");
    scanf("%s", arraddress);
    strcpy(H->data.arraddress, arraddress);
    return;
}

// 修改起飞时间
void root_xiugai_hang_3(hang *H)
{
    char stime[20]; // 起飞时间
    printf("请输入修改后的起飞时间：\n");
    scanf("%s", stime);
    strcpy(H->data.stime, stime);
    return;
}

// 修改目的时间
void root_xiugai_hang_4(hang *H)
{
    char atime[20]; // 到达时间
    printf("请输入修改后的到达时间：\n");
    scanf("%s", atime);
    strcpy(H->data.atime, atime);
    return;
}

// 修改机型
void root_xiugai_hang_5(hang *H)
{
    char TYPE[40]; // 机型
    printf("请输入修改后的机型：\n");
    scanf("%s", TYPE);
    strcpy(H->data.TYPE, TYPE);
    return;
}

// 修改班期
void root_xiugai_hang_6(hang *H)
{
    char DATE[20]; // 班期
    printf("请输入修改后的班期：\n");
    scanf("%s", DATE);
    strcpy(H->data.DATE, DATE);
    return;
}

// 修改票价
void root_xiugai_hang_7(hang *H)
{
    int value; // 票价
    printf("请输入修改后的票价：\n");
    scanf("%d", &value);
    H->data.value = value;
    return;
}

// 修改额定载客量
void root_xiugai_hang_8(hang *H)
{
    int maxNUM; // 额定载客量，
    printf("请输入修改后的额定载客量：\n");
    scanf("%d", &maxNUM);
    H->data.maxNUM = maxNUM;
    return;
}

// 修改剩余座位数量
void root_xiugai_hang_9(hang *H)
{
    int leftbuyersa; // 剩余座位数量
    printf("请输入修改后的剩余座位数量：\n");
    scanf("%d", &leftbuyersa);
    H->data.leftbuyersa = leftbuyersa;
    return;
}

// 修改是否起飞
void root_xiugai_hang_10(hang *H)
{
    char whetherfly; // 是否起飞 ‘y’ ‘n’
    printf("请输入修改后的是否起飞：\n");
    scanf("%c", &whetherfly);
    H->data.whetherfly = whetherfly;
    return;
}

// 修改起飞时间
void root_xiugai_hang_11(hang *H)
{
    char number[20]; // 航班号
    printf("请输入修改后的航班号：\n");
    scanf("%s", number);
    strcpy(H->data.number, number);
    return;
}

// 增加root用户
void root_zeng()
{
    FILE *fp = file_open("花名册.txt", "a");
    Node *z = (Node *)malloc(sizeof(Node));
    strcpy(z->data.userType, "root");
    z->data.value = 0;
    z->data.vip = 5;
    Link_list *L = nacun(); // 把文件里面的东西放在链表里面
    printf("请输入你的用户名：\n");
    while (1)
    {
        int flag_1 = 0;
        scanf("%s", z->data.name);
        Node *ptr = L->next;
        for (size_t i = 0; ptr != NULL; i++) // 循环比较
        {
            if (strcmp(ptr->data.name, z->data.name) == 0)
            {
                flag_1 = -98;
                break;
            }
            ptr = ptr->next; // 往后移
        }
        if (flag_1 == -98)
        {
            printf("该用户名已存在，请重新输入...\n");
            continue;
        }
        else
        {
            break;
        }
    }

    printf("请输入你的账号：\n");
    while (1)
    {
        int flag_1 = 0;
        scanf("%s", z->data.id);
        Node *ptr = L->next;
        for (size_t i = 0; ptr != NULL; i++) // 循环比较
        {
            if (strcmp(ptr->data.id, z->data.id) == 0)
            {
                flag_1 = -98;
                break;
            }
            ptr = ptr->next; // 往后移
        }
        if (flag_1 == -98)
        {
            printf("该账号已存在，请重新输入...\n");
            continue;
        }
        else
        {
            break;
        }
    }
    printf("请输入你的密码：\n");
    scanf("%s", z->data.pos);
    fprintf(fp, "%s;%s;%s;%s;%d;%d\n",
            z->data.userType, z->data.id, z->data.pos, z->data.name, z->data.value, z->data.vip);
    file_close(&fp);
    printf("注册成功，以下为你的信息\n");
    print_link_list_1(z);
    pause_and_continue();
    free_link_list(&L);
}
